import { BasePlugin } from './base-plugin.js'
import { createLogger } from '../utils/logger.js'

const logger = createLogger('PluginManager')

/**
 * 插件管理器
 * 负责管理所有插件的生命周期
 */
export class PluginManager {
    constructor(editor) {
        this.editor = editor
        this.plugins = new Map() // 插件实例映射
        this.pluginClasses = new Map() // 插件类映射
    }

    /**
     * 注册插件类
     * @param {string} name - 插件名称
     * @param {class} PluginClass - 插件类
     */
    registerPlugin(name, PluginClass) {
        if (!PluginClass.prototype instanceof BasePlugin && PluginClass !== BasePlugin) {
            throw new Error(`${name} 必须继承 BasePlugin`)
        }
        this.pluginClasses.set(name, PluginClass)
    }

    /**
     * 创建并安装插件
     * @param {string} name - 插件名称
     * @param {Object} options - 插件配置选项
     */
    installPlugin(name, options = {}) {
        if (this.plugins.has(name)) {
            logger.warn(`${name} 已经安装`)
            return
        }

        const PluginClass = this.pluginClasses.get(name)
        if (!PluginClass) {
            throw new Error(`${name} 没有注册`)
        }

        try {
            const plugin = new PluginClass(this.editor, options)
            plugin.initialize()
            this.plugins.set(name, plugin)
            
            this.editor.emit('plugin:installed', { plugin: name, options })
            logger.plugin(`${name} 安装成功`)
        } catch (error) {
            logger.error(`${name} 安装失败:`, error)
            throw error
        }
    }

    /**
     * 卸载插件
     * @param {string} name - 插件名称
     */
    uninstallPlugin(name) {
        const plugin = this.plugins.get(name)
        if (!plugin) {
            logger.warn(`${name} 没有安装`)
            return
        }

        try {
            plugin.destroy()
            this.plugins.delete(name)
            this.editor.emit('plugin:uninstalled', { plugin: name })
            logger.plugin(`${name} 卸载成功`)
        } catch (error) {
            logger.error(`${name} 卸载失败:`, error)
        }
    }

    /**
     * 启用插件
     * @param {string} name - 插件名称
     */
    enablePlugin(name) {
        const plugin = this.plugins.get(name)
        if (!plugin) {
            throw new Error(`${name} 没有安装`)
        }
        plugin.enable()
    }

    /**
     * 禁用插件
     * @param {string} name - 插件名称
     */
    disablePlugin(name) {
        const plugin = this.plugins.get(name)
        if (!plugin) {
            throw new Error(`${name} 没有安装`)
        }
        plugin.disable()
    }

    /**
     * 获取插件实例
     * @param {string} name - 插件名称
     * @returns {BasePlugin|null} 插件实例
     */
    getPlugin(name) {
        return this.plugins.get(name) || null
    }

    /**
     * 获取所有已安装的插件信息
     * @returns {Array} 插件信息数组
     */
    getAllPlugins() {
        return Array.from(this.plugins.entries()).map(([name, plugin]) => ({
            name,
            ...plugin.getInfo()
        }))
    }

    /**
     * 获取已启用的插件列表
     * @returns {Array} 已启用的插件名称数组
     */
    getEnabledPlugins() {
        return Array.from(this.plugins.entries())
            .filter(([, plugin]) => plugin.enabled)
            .map(([name]) => name)
    }

    /**
     * 批量安装并配置插件
     * @param {Object} config - 插件配置对象
     * 格式: { pluginName: { enabled: true, options: {} } }
     */
    installPluginsFromConfig(config) {
        for (const [name, pluginConfig] of Object.entries(config)) {
            try {
                this.installPlugin(name, pluginConfig.options || {})
                if (pluginConfig.enabled !== false) {
                    this.enablePlugin(name)
                }
            } catch (error) {
                logger.error(`${name} 安装失败:`, error)
            }
        }
    }

    /**
     * 销毁所有插件
     */
    destroy() {
        for (const [name] of this.plugins) {
            this.uninstallPlugin(name)
        }
        this.plugins.clear()
        this.pluginClasses.clear()
    }
}